package com.gsk.europepharma.salesReport.struts.actions;

import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRAdmPdtDAO;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRSectoDAO;
import com.gsk.europepharma.salesReport.utils.CodeLibelle;
import com.gsk.europepharma.salesReport.utils.Legende;
import com.gsk.europepharma.salesReport.utils.MixProduit;
import com.gsk.europepharma.salesReport.utils.Palette;
import com.gsk.europepharma.salesReport.utils.Produit;

/**
 * Parametrage des principales variables pour l'affichage de la page principale.
 */
public class Parametrage extends Action {
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		HttpSession sessionObject = request.getSession();
		
		String lib_marche = "";
		String lib_pdt = "";
		String lib_origine = "";
		String lib_mois = "";
		boolean ugp = false;
		String CS_SRC = "";
		String unite = "";
		
		// Debut : Recuperation des infos a partir du cs_adm_pdt
		
		int cs_adm_pdt = Integer.parseInt(sessionObject.getAttribute("cs_adm_pdt").toString());
		
		// Debut : 1ere requete 
		tbSpBoSRSectoDAO sectoDao = new tbSpBoSRSectoDAO();
		Session session = sectoDao.getSession();
		Query req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_cs_adm_rgpt);
		req.setInteger("cs_adm_pdt", cs_adm_pdt);
		ArrayList result = new ArrayList(req.list());
		if (result.size() > 0) {
			Object[] resultReq = (Object[]) result.get(0);
			sessionObject.setAttribute("cs_adm_rgpt", Integer.parseInt(resultReq[0].toString()));
			sessionObject.setAttribute("cs_adm_prstn", Integer.parseInt(resultReq[1].toString()));
			if (resultReq[2] != null) {
				CS_SRC = resultReq[2].toString();
			} else {
				CS_SRC = "0";
			}
			// resultReq[3].toString(); // CODE 0+1 
			lib_marche = resultReq[4].toString();
			lib_pdt = resultReq[5].toString();
			lib_origine = resultReq[6].toString();
			unite = resultReq[7].toString();
			ugp = CS_SRC.equals("1") || CS_SRC.equals("2") || CS_SRC.equals("3") || CS_SRC.equals("4") || CS_SRC.equals("5") || CS_SRC.equals("6");
			sessionObject.setAttribute("ugp", ugp);
		} else {
			// Erreur : produit mal paramétré !!!
			sessionObject.setAttribute("cs_adm_rgpt", 0);
			sessionObject.setAttribute("cs_adm_prstn", 0);
			CS_SRC = "0";
			lib_marche = "";
			lib_pdt = "";
			lib_origine = "";
			unite = "";
			ugp = CS_SRC.equals("1") || CS_SRC.equals("2") || CS_SRC.equals("3") || CS_SRC.equals("4") || CS_SRC.equals("5") || CS_SRC.equals("6");
			sessionObject.setAttribute("ugp", ugp);
		}
		
		// Fin : 1ere requete 
		
		// Debut : 2e requete 
		sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_DATA_MONTH);
		req.setInteger("cs_adm_pdt", cs_adm_pdt);
		result = new ArrayList(req.list());
		Integer resultCsMonth = 0;
		if (result.get(0) != null) {
			resultCsMonth = Integer.parseInt(result.get(0).toString());
			sessionObject.setAttribute("cs_month", resultCsMonth);
		} else {
			sessionObject.setAttribute("cs_month", resultCsMonth);
		}
		// Fin : 2e requete 
		
		// Debut : 3e requete 
		sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_DATA_MONTH_LIB);
		req.setInteger("cs_month", resultCsMonth);
		result = new ArrayList(req.list());
		String libMonth = "";
		if (result.size() > 0 && result.get(0) != null) {
			libMonth = result.get(0).toString();
		}
		lib_mois = libMonth;
		// Fin : 3e requete 
		
		// Fin : Recuperation des infos a partir du cs_adm_pdt
		
		// Utilisateur 
		Principal user = request.getUserPrincipal();
		sessionObject.setAttribute("login", user.getName());
		
		// Requete 
		sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_RECUP_NIVEAU_LOGIN);
		req.setInteger("cs_network", (Integer) sessionObject.getAttribute("cs_network"));
		req.setString("login", user.getName()); // TEST : OOG0284 BBT43390 LLA38678
		result = new ArrayList(req.list());
		Iterator iter = result.iterator();
		String niveau = "France";
		Integer cs_niveau = 0;
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			niveau = tmp[0].toString();
			cs_niveau = Integer.parseInt(tmp[1].toString());
		}
		sessionObject.setAttribute("niveau", niveau); // France/0 Zone/281 Region/783/786 Secteur/2440/2433
		sessionObject.setAttribute("cs_niveau", cs_niveau);
		// End Requete
        
        // Periode
        String periode = "CF";
        
        // Liste des sources 
        sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_RECUP_SOURCES);
		req.setInteger("cs_adm_pdt", (Integer) sessionObject.getAttribute("cs_adm_pdt"));
		result = new ArrayList(req.list());
		iter = result.iterator();
		List<CodeLibelle> sources = new ArrayList<CodeLibelle>();
		CodeLibelle source;
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			source = new CodeLibelle();
			source.setCode(tmp[0].toString());
			source.setLibelle(tmp[1].toString());
			sources.add(source);
		}
		
		// Liste des indicateurs
		tbSpBoSRAdmPdtDAO admPdtDao = new tbSpBoSRAdmPdtDAO();
		session = admPdtDao.getSession();
		req = session.getNamedQuery(admPdtDao.QUERY_LISTE_INDICATEURS);
		req.setInteger("cs_adm_pdt", cs_adm_pdt);
		result = new ArrayList(req.list());
		iter = result.iterator();
		List<CodeLibelle> indicateurs = new ArrayList<CodeLibelle>();
		CodeLibelle indicateur;
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			
			boolean checked = (tmp[0] != null) && (tmp[0].toString().equals("Y")); 
			if (checked) {
				indicateur = new CodeLibelle();
				indicateur.setCode("PM");
				indicateur.setLibelle("PM");
				indicateurs.add(indicateur);
			}
			
			checked = (tmp[1] != null) && (tmp[1].toString().equals("Y")); 
			if (checked) {
				indicateur = new CodeLibelle();
				indicateur.setCode("D_PM");
				indicateur.setLibelle("&Delta;PM (pt)");
				indicateurs.add(indicateur);
			}
			
			checked = (tmp[2] != null) && (tmp[2].toString().equals("Y")); 
			if (checked) {
				indicateur = new CodeLibelle();
				indicateur.setCode("VOL");
				indicateur.setLibelle("VOL");
				indicateurs.add(indicateur);
			}
			
			checked = (tmp[3] != null) && (tmp[3].toString().equals("Y")); 
			if (checked) {
				indicateur = new CodeLibelle();
				indicateur.setCode("D_VOL");
				indicateur.setLibelle("&Delta;VOL (vol)");
				indicateurs.add(indicateur);
			}
			
			checked = (tmp[4] != null) && (tmp[4].toString().equals("Y")); 
			if (checked) {
				indicateur = new CodeLibelle();
				indicateur.setCode("EVOL_VOL");
				indicateur.setLibelle("EVOL VOL (%)");
				indicateurs.add(indicateur);
			}
			
		}
		
		// Statut du produit : complet, pas de marche, lancement ou incomplet
		String statutProduit = "";
		if (indicateurs.size() == 5) {
			statutProduit = "complet";
		} else if (indicateurs.size() == 3) {
			statutProduit = "pasDeMarche";
		} else if (indicateurs.size() == 2) {
			statutProduit = "lancement";
		} else if (indicateurs.size() == 1) {
			statutProduit = "incomplet";
		}
        
        // Liste de tous les produits  
        sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_RECUP_PRODUITS);
		req.setInteger("cs_adm_pdt", (Integer) sessionObject.getAttribute("cs_adm_pdt"));
		req.setInteger("cs_src", Integer.parseInt(CS_SRC));
		result = new ArrayList(req.list());
		iter = result.iterator();
		List<Produit> produits = new ArrayList<Produit>();
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			String color = "";
			if (tmp[4] != null) {
				color = "#" + tmp[4].toString();
			}
			boolean checked = (tmp[3].toString().equals("1")); // produit par defaut ou pas 
			Produit produit = new Produit(Integer.parseInt(tmp[0].toString()), Integer.parseInt(tmp[1].toString()), tmp[2].toString(), checked, color);
			produits.add(produit);
		}
        MixProduit mixProduit = new MixProduit();
        mixProduit.setProduits(produits);
        sessionObject.setAttribute("mixProduit", mixProduit);
        
        // Activité 
        
        // Liste de toutes les equipes  
        sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_RECUP_EQUIPES);
		req.setInteger("cs_adm_pdt", (Integer) sessionObject.getAttribute("cs_adm_pdt"));
		req.setInteger("cs_month", resultCsMonth);
		result = new ArrayList(req.list());
		iter = result.iterator();
		List<CodeLibelle> equipes = new ArrayList<CodeLibelle>();
		CodeLibelle equipe = new CodeLibelle();
		equipe.setCode("0");
		equipe.setLibelle("TOTAL EQUIPES");
		equipes.add(equipe);
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			equipe = new CodeLibelle();
			equipe.setCode(tmp[0].toString());
			equipe.setLibelle(tmp[1].toString());
	        equipes.add(equipe);
		}
		
		// Liste de toutes les specialites   
        sectoDao = new tbSpBoSRSectoDAO();
		session = sectoDao.getSession();
		req = session.getNamedQuery(tbSpBoSRSectoDAO.QUERY_RECUP_SPECIALITES);
		result = new ArrayList(req.list());
		iter = result.iterator();
		List<CodeLibelle> specialites = new ArrayList<CodeLibelle>();
		CodeLibelle specialite;
		while (iter.hasNext()) {
			Object[] tmp = (Object[]) iter.next();
			specialite = new CodeLibelle();
			specialite.setCode(tmp[0].toString());
			specialite.setLibelle(tmp[1].toString());
			specialites.add(specialite);
		}
		
        // Fin activité
		
		// Legendes pour la carto
		
		// Legende region
		Legende legendeRegion = new Legende();
		legendeRegion.setNbCouleurs(3);
		legendeRegion.setNbTranches(3);
		legendeRegion.setTypeClassement("PE");
		List<Palette> palettes = new ArrayList<Palette>();
		Palette palette1 = new Palette();
		palette1.setColor("#FF0000");
		palette1.setMin(0.0);
		palette1.setMax(0.0);
		palettes.add(palette1);
		Palette palette2 = new Palette();
		palette2.setColor("#FFFF00");
		palette2.setMin(0.0);
		palette2.setMax(0.0);
		palettes.add(palette2);
		Palette palette3 = new Palette();
		palette3.setColor("#00FF00");
		palette3.setMin(0.0);
		palette3.setMax(0.0);
		palettes.add(palette3);
		legendeRegion.setCouleurBase1("#FF0000");
		legendeRegion.setCouleurBase2("#FFFF00");
		legendeRegion.setCouleurBase3("#00FF00");
		legendeRegion.setPalettes(palettes);
		// Legende secteur
		Legende legendeSecteur = new Legende();
		legendeSecteur.setNbCouleurs(3);
		legendeSecteur.setNbTranches(3);
		legendeSecteur.setTypeClassement("PE");
		legendeSecteur.setCouleurBase1("#FF0000");
		legendeSecteur.setCouleurBase2("#FFFF00");
		legendeSecteur.setCouleurBase3("#00FF00");
		palettes = new ArrayList<Palette>();
		palette1 = new Palette();
		palette1.setColor("#FF0000");
		palette1.setMin(0.0);
		palette1.setMax(0.0);
		palettes.add(palette1);
		palette2 = new Palette();
		palette2.setColor("#FFFF00");
		palette2.setMin(0.0);
		palette2.setMax(0.0);
		palettes.add(palette2);
		palette3 = new Palette();
		palette3.setColor("#00FF00");
		palette3.setMin(0.0);
		palette3.setMax(0.0);
		palettes.add(palette3);
		legendeSecteur.setPalettes(palettes);
		// Mise en session des legendes 
		sessionObject.setAttribute("legendeRegion", legendeRegion);
		sessionObject.setAttribute("legendeSecteur", legendeSecteur);
		
		// Fin des legendes pour la carto
        
		// Valeurs envoyees dans l'action 
		HashMap hm = new HashMap();
        hm.put("unite", unite);
        hm.put("periode", periode);
        hm.put("CS_SRC", CS_SRC);
        hm.put("mixProduit", mixProduit);
        hm.put("sources", sources);
        hm.put("equipes", equipes);
        hm.put("specialites", specialites);
        hm.put("lib_marche", lib_marche);
        hm.put("lib_pdt", lib_pdt);
        hm.put("lib_origine", lib_origine);
        hm.put("lib_mois", lib_mois);
        hm.put("ugp", ugp);
        hm.put("indicateurs", indicateurs);
        hm.put("statutProduit", statutProduit);
        
        JSONObject json = JSONObject.fromObject(hm);

        response.addHeader("Content-Type", "application/json");
        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
        response.getOutputStream().flush();

		return null;
	}

}
